package sivan.process;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.core.Ordered;
import sivan.domain.Person;

/**
 * Created by sivan on 2019/2/25.
 * 在SpringIOC容器创建的每个bean实例在初始化之前调用。
 * 使用该类可以对bean进行加工处理.
 * @Autowired的依赖注解就是BeanPostProcessor的实现
 * 主要还是用于注入属性和完善配置
 */
public class SecondBeanPostProcessor implements BeanPostProcessor,Ordered {

    /**
     * bean初始化方法调用前被调用
     * 在bean实例化之前修改了对象
     * @param bean
     * @param beanName
     * @return
     * @throws BeansException
     */
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("执行了SecondBeanPostProcessor====================");
        return bean;
    }

    /**
     * bean初始化方法调用后被调用
     * 使用场景：在依赖注入时，可以在bean初始化之后根据注解实现具体bean的控制
     * @param bean
     * @param beanName
     * @return
     * @throws BeansException
     */
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof Person){
            return new Person();
        }
        return bean;
    }

    @Override
    public int getOrder() {
        return -1;
    }
}
